package com.cskaoyan.javase.oop3._1interface._1basic;

/**
 * 接口的特点我们主要研究以下方面
 * 1. 接口的声明特点
 * 2. 接口的实现类的书写格式
 *      很多时候，接口和它的实现类都会写在一起。
 *      往往会在接口那个包下，创建一个包叫"impl"，用于存放接口的实现类
 *      并且接口的实现类，直接命名为“接口名 + Impl”
 *      当然这种命名格式也不是强制的
 * 3. 成员特点
 *      接口中是没有属性的，因为接口中的成员变量，默认都是public static final修饰的，都是全局常量
 *      这些修饰符不需要写出来，已经隐含了。
 *      接口中的全局常量必须是public修饰的
 *      一般情况下，在接口中定义全局常量，直接写数据类型 常量名 = 值; 就可以了
 *      在接口中没有静态代码块，全局常量的赋值只能显式赋值，就这一种。
 *      最后，实际开发中，最好不要在接口中写全局常量，除非你非用不可。
 *
 *   接口中的方法默认都是public abstract修饰的，这两个修饰符不需要写出来，而且public是必须的，改不了。
 *   接口中所有能定义的成员，访问权限修饰符都是public，而且改不了。
 *   我们以后在接口中定义抽象方法，完全不需要写出public abstract修饰符（禁止写出来）
 *   应该直接写：
 *          返回值类型 方法名(形参列表);
 *
 *   在Java8之前，接口中，仅能定义抽象方法，接口中没有任何实现方法。
 *   在Java8中，引入了两种实现方法：
 *      1.默认方法
 *      2.静态方法
 *   仅供了解，开发中可能会偶尔见到它们，但是不太可能自己定义。
 *
 * 4. 构造器
 *      接口是没有构造器,它也不需要构造器
 *      如果一个类直接实现某个接口,而没有直接继承一个类,那么super()指向Object
 *      接口是和class同等级别的引用数据类型,那么接口继承Object吗?
 *          在底层,接口实际上继承Object的.
 *
 * 5. 代码块
 *      没有构造器,也没有构造代码块.
 *      没有静态代码块.
 *
 *  接口的子类,接口的实现类:
 *      1.普通类,必须要实现所有的抽象方法
 *      2.抽象类,可以自由选择实现抽象方法,当然也能不实现
 *      3.接口,接口可以继承接口,使用关键字extends,而且接口是多继承的
 *
 * 总结一下，接口和类的继承/实现的规则：
 *
 * 1. 继承（extends）是不能跨越种族的，类和类继承，接口和接口继承，接口和类之间没有继承关系。
 *    - 普通类继承一个抽象类，需要实现里面的所有抽象方法。
 *    - 抽象类继承一个抽象类，按需实现里面的抽象方法。
 *    - 抽象类继承一个普通类，是可以的。
 *    - 接口在继承一个接口后，会得到接口的所有抽象方法。
 *    - 类的继承是单继承的，接口的继承是多继承的。
 * 2. 实现（implements），必须发现在类与接口之间，接口和类是没有任何关系的。
 *    - 普通类实现接口，必须实现所有抽象方法
 *    - 抽象类实现接口，按需实现抽象方法
 *
 *
 * @since 11:41
 * @author wuguidong@cskaoyan.onaliyun.com
 */
// Modifier 'abstract' is redundant for interfaces
public interface IDemo {
    // Variable 'a' might not have been initialized
    int A = 10;
    int B = 20;
    String STRING = new String("123");

    // 方法
    void test();

    int test2();

    void test3(String str);

    // 定义Java8中的默认方法,使用关键字default
    default void testDefault() {
        System.out.println("hello world!");
    }

    // 定义Java8中的静态方法,使用关键字static
    static void testStatic() {
        System.out.println("你好,世界!");
    }


}
